﻿/*
 * SonarAnalyzer for .NET
 * Copyright (C) 2014-2025 SonarSource Sàrl
 * mailto:info AT sonarsource DOT com
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the Sonar Source-Available License for more details.
 *
 * You should have received a copy of the Sonar Source-Available License
 * along with this program; if not, see https://sonarsource.com/license/ssal/
 */

namespace SonarAnalyzer.VisualBasic.Rules
{
    [DiagnosticAnalyzer(LanguageNames.VisualBasic)]
    public sealed class IfChainWithoutElse : IfChainWithoutElseBase<SyntaxKind, MultiLineIfBlockSyntax>
    {
        protected override ILanguageFacade<SyntaxKind> Language => VisualBasicFacade.Instance;
        protected override SyntaxKind SyntaxKind => SyntaxKind.MultiLineIfBlock;
        protected override string ElseClause => "Else";

        protected override bool IsElseIfWithoutElse(MultiLineIfBlockSyntax ifSyntax) =>
            ifSyntax.ElseIfBlocks.Any()
            && (ifSyntax.ElseBlock == null || IsEmptyBlock(ifSyntax));

        protected override Location IssueLocation(SonarSyntaxNodeReportingContext context, MultiLineIfBlockSyntax ifSyntax) =>
            ifSyntax.ElseIfBlocks.Last().ElseIfStatement.ElseIfKeyword.GetLocation();

        private static bool IsEmptyBlock(MultiLineIfBlockSyntax multiLineIfBlock) =>
            !(multiLineIfBlock.ElseBlock.Statements.Count > 0
            || multiLineIfBlock.ElseBlock.GetTrailingTrivia().Any(IsCommentOrDisabledText)
            || multiLineIfBlock.EndIfStatement.GetLeadingTrivia().Any(IsCommentOrDisabledText));

        private static bool IsCommentOrDisabledText(SyntaxTrivia trivia) =>
            trivia.IsComment() || trivia.IsKind(SyntaxKind.DisabledTextTrivia);
    }
}
